package island.gotenyama.wand.validation;

import island.gotenyama.wand.annotation.FieldDefinition;
import island.gotenyama.wand.bean.AField;
import island.gotenyama.wand.bean.MessageKey;
import island.gotenyama.wand.exception.FatalException;

import java.util.regex.Pattern;

import org.springframework.stereotype.Component;

/**
 * 銀行口座名に利用できるカナ文字かを検証する。
 * 
 * @author tkawabata
 */
@Component
public class BankAccountValidation extends AValidation {

	/**
	 * 正規表現
	 */
	public static final String regex = "[０-９ァ-ロワヲンヴＡ-Ｚ゛゜￥「」，．（）ー‐―／　]*";

	/**
	 * パターン
	 */
	public static final Pattern pattern = Pattern.compile(regex);

	/**
	 * エラーコード
	 */
	public static final String errorCode = "input.error.regex";

	@Override
	public boolean isValid(Object entry, Object... params) {
		if (entry == null) {
			return true;
		}
		if (entry instanceof Number) {
			return true;
		}
		return pattern.matcher(entry.toString()).matches();
	}

	@Override
	public MessageKey validate(AField aField, Object entry) {
		if (aField == null) {
			throw new FatalException("NULLのため、検証できない。");
		}
		if (isValid(entry)) {
			return null;
		} else {
			FieldDefinition fieldDef = aField.getFieldDefinition();
			return new MessageKey(errorCode, fieldDef.name(), fieldDef.nameJp(), "全角カタカナ");
		}
	}
}
